package com.servitware.cardio.domain;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Map;
import java.util.TreeMap;

import com.servitware.core.id.base.IntIded;
import com.servitware.core.id.base.InvalidIdException;

public class Informe extends IntIded implements Serializable
{
	private static final long serialVersionUID = -8880176142810024492L;

	public static final String PDF_NAME_TEMPLATE = "-cr-informe.pdf";
	

	private Timestamp fecha = null;
	
	/*
	 * duracion real de la sesion, se extra del archivo de sesion
	 */
	private Integer duracionMinutos = null;
	private Integer duracionHoras = null;

	/*
	 * Hora inicio
	 */
	private String horaInicioHor = null;
	private String horaInicioMin = null;
	private String horaInicioSeg = null;
	
	/*
	 * valores de frecuencia cardiaca
	 */
	private Integer fcMedia = null;
	private Integer fcMinima = null;
	private Integer fcMaxima = null;
	private Integer fcReposo = null;
	private Integer fcMaximoEsfuerzo = null;
	private Integer fcEntrenamientoMinima = null;
	private Integer fcEntrenamientoMaxima = null;
	private Integer tiempoRecuperacion = null;

	private String interpretacion = null;
	private String recomendaciones = null;
	
	private int status;

	
	/*
	 * pags del ecg que se seleccionan para justificar resultados
	 */
	private Map<Integer, String> segmentosEcg = null;

	public Informe()
	{
		super();
		status = InformeStatus._0_Inicial.getStatus();
	}

	
	public Informe(int id) throws InvalidIdException
	{
		super(id);
	}


	public String getDirPorFecha()
	{
		Calendar cal = Calendar.getInstance();
		cal.setTime( getFecha() );
		
		StringBuilder dir = new StringBuilder( cal.get(Calendar.YEAR) + "/");
		
		/*
		 * tiene en cuenta que Calendar trata los meses ZERO based, por lo tanto, suma 1
		 */
		int month = cal.get(Calendar.MONTH) + 1;
		dir.append( ((month < 10) ? "0":"") + month + "/");
		
		int day = cal.get(Calendar.DAY_OF_MONTH);
		dir.append( ((day < 10) ? "0":"") + day );
		
		return dir.toString();
	}

	
	public InformeStatus getInformeStatus()
	{
		for( InformeStatus value : InformeStatus.values() )
		{
			if( value.getStatus() == status)
				return value;
		}
		
		return null;
	}

	
	public void setInformeStatus(InformeStatus status)
	{
		this.status = status.getStatus();
	}

	
	/**
	 * NO TOCAR -- No generado *
	 * 
	 * @return nombre del archivo pdf que se crea como informe de la sesion
	 */
	public final String getNombreArchivoInforme()
	{
		return String.valueOf(getId()) + PDF_NAME_TEMPLATE;
	}



	public String getDuracion()
	{
		
		int h = duracionHoras.intValue();
		int m = duracionMinutos.intValue();
		String hs = ((h < 10) ? "0" : "") + String.valueOf(h);
		String ms = ((m < 10) ? "0" : "") + String.valueOf(m);
		return hs + ":" + ms;
	}

	public Integer getDuracionMin()
	{
		
		return (duracionHoras.intValue() * 60) + duracionMinutos.intValue();
		
	}
	
	public void setDuracionMinutos(Integer duracionMinutos)
	{
		if (duracionMinutos == null)
		{
			this.duracionMinutos = 0;
			return;
		}

		if (duracionMinutos < 0)
		{
			this.duracionMinutos = 0;
			return;
		}

		this.duracionMinutos = duracionMinutos;
	}
	
	public void setDuracionMinutos( String duracionMinutos)
	{
		Integer dm = null;
		try
		{
			dm = new Integer(duracionMinutos);
		}
		catch(NumberFormatException e)
		{
			dm = null;
		}
		setDuracionMinutos( dm );
	}
	
	public boolean haySegmentos()
	{
		return (segmentosEcg != null) && (segmentosEcg.size() > 0);
	}

	public boolean contieneSegmento(Integer seg)
	{
		if (!haySegmentos())
			return false;

		return segmentosEcg.keySet().contains(seg);
	}

	/**
	 * Deep clone del parametro
	 * 
	 * @param segmentosEcg
	 */
	public void setSegmentosEcg(Map<Integer, String> segEcg)
	{
		if ((segEcg == null) || (segEcg.size() < 1))
		{
			segmentosEcg = null;
			return;
		}

		if (segmentosEcg == null)
		{
			segmentosEcg = new TreeMap<Integer, String>();
		}
		else
		{
			segmentosEcg.clear();
		}

		Integer key;
		String desc;

		for (Integer k : segEcg.keySet())
		{
			key = new Integer(k.intValue());
			desc = new String(segEcg.get(k));
			segmentosEcg.put(key, desc);
		}
	}

	
	public void setFcMedia(String fcMedia)
	{
		try
		{
			this.fcMedia = new Integer(fcMedia);
		}
		catch (NumberFormatException e)
		{
			this.fcMedia = null;
		}
	}

	public void setFcMinima(String fcMinima)
	{
		try
		{
			this.fcMinima = new Integer(fcMinima);
		}
		catch (NumberFormatException e)
		{
			this.fcMinima = null;
		}
	}

	public void setFcMaxima(String fcMaxima)
	{
		try
		{
			this.fcMaxima = new Integer(fcMaxima);
		}
		catch (NumberFormatException e)
		{
			this.fcMaxima = null;
		}
	}

	public void setFcReposo(String fcReposo)
	{
		try
		{
			this.fcReposo = new Integer(fcReposo);
		}
		catch (NumberFormatException e)
		{
			this.fcReposo = null;
		}
	}

	public void setFcMaximoEsfuerzo(String fcMaximoEsfuerzo)
	{
		try
		{
			this.fcMaximoEsfuerzo = new Integer(fcMaximoEsfuerzo);
		}
		catch (NumberFormatException e)
		{
			this.fcMaximoEsfuerzo = null;
		}
	}

	public void setFcEntrenamientoMinima(String fcEntrenamientoMinima)
	{
		try
		{
			this.fcEntrenamientoMinima = new Integer(fcEntrenamientoMinima);
		}
		catch (NumberFormatException e)
		{
			this.fcEntrenamientoMinima = null;
		}
	}

	public void setFcEntrenamientoMaxima(String fcEntrenamientoMaxima)
	{
		try
		{
			this.fcEntrenamientoMaxima = new Integer(fcEntrenamientoMaxima);
		}
		catch (NumberFormatException e)
		{
			this.fcEntrenamientoMaxima = null;
		}
	}

	public void setTiempoRecuperacion(String tiempoRecuperacion)
	{
		try
		{
			this.tiempoRecuperacion = new Integer(tiempoRecuperacion);
		}
		catch (NumberFormatException e)
		{
			this.tiempoRecuperacion = null;
		}
	}

	
//	Valores Integer as String, in case of...
	
	public String getFcMediaAsString()
	{
		if( fcMedia != null)
			return fcMedia.toString();
		
		return "";
	}

	public String getFcMinimaAsString()
	{
		if( fcMinima != null )
			return fcMinima.toString();
		
		return "";
	}

	public String getFcMaximaAsString()
	{
		if( fcMaxima != null )
			return fcMaxima.toString();
		
		return "";
	}

	public String getFcReposoAsString()
	{
		if( fcReposo != null )
		return fcReposo.toString();
		
		return "";
	}

	public String getFcMaximoEsfuerzoAsString()
	{
		if( fcMaximoEsfuerzo!=null)
			return fcMaximoEsfuerzo.toString();
		
		return "";
	}

	public String getFcEntrenamientoMinimaAsString()
	{
		if( fcEntrenamientoMinima != null )
			return fcEntrenamientoMinima.toString();
		
		return "";
	}

	public String getFcEntrenamientoMaximaAsString()
	{
		if( fcEntrenamientoMaxima != null )
			return fcEntrenamientoMaxima.toString();
		
		return "";
	}

	public String getTiempoRecuperacionAsString()
	{
		if( tiempoRecuperacion != null )
			return tiempoRecuperacion.toString();
		
		return "";
	}

/*
//	getters & setters
 * 	------------------------------------------------------------------
 * 
 */
	public Map<Integer, String> getSegmentosEcg()
	{
		return segmentosEcg;
	}

	public Integer getFcMedia()
	{
		return fcMedia;
	}

	public void setFcMedia(Integer fcMedia)
	{
		this.fcMedia = fcMedia;
	}

	public Integer getFcMinima()
	{
		return fcMinima;
	}

	public void setFcMinima(Integer fcMinima)
	{
		this.fcMinima = fcMinima;
	}

	public Integer getFcMaxima()
	{
		return fcMaxima;
	}

	public void setFcMaxima(Integer fcMaxima)
	{
		this.fcMaxima = fcMaxima;
	}

	public Integer getFcReposo()
	{
		return fcReposo;
	}

	public void setFcReposo(Integer fcReposo)
	{
		this.fcReposo = fcReposo;
	}

	public Integer getFcMaximoEsfuerzo()
	{
		return fcMaximoEsfuerzo;
	}

	public void setFcMaximoEsfuerzo(Integer fcMaximoEsfuerzo)
	{
		this.fcMaximoEsfuerzo = fcMaximoEsfuerzo;
	}

	public Integer getFcEntrenamientoMinima()
	{
		return fcEntrenamientoMinima;
	}

	public void setFcEntrenamientoMinima(Integer fcEntrenamientoMinima)
	{
		this.fcEntrenamientoMinima = fcEntrenamientoMinima;
	}

	public Integer getFcEntrenamientoMaxima()
	{
		return fcEntrenamientoMaxima;
	}

	public void setFcEntrenamientoMaxima(Integer fcEntrenamientoMaxima)
	{
		this.fcEntrenamientoMaxima = fcEntrenamientoMaxima;
	}

	public Integer getTiempoRecuperacion()
	{
		return tiempoRecuperacion;
	}

	public void setTiempoRecuperacion(Integer tiempoRecuperacion)
	{
		this.tiempoRecuperacion = tiempoRecuperacion;
	}

	public String getInterpretacion()
	{
		return interpretacion;
	}

	public void setInterpretacion(String interpretacion)
	{
		this.interpretacion = interpretacion;
	}

	public String getRecomendaciones()
	{
		return recomendaciones;
	}

	public void setRecomendaciones(String recomendaciones)
	{
		this.recomendaciones = recomendaciones;
	}


	public Integer getDuracionMinutos()
	{
		return duracionMinutos;
	}

	public Timestamp getFecha()
	{
		return fecha;
	}

	public void setFecha(Timestamp fecha)
	{
		this.fecha = fecha;
	}

	public int getStatus()
	{
		return status;
	}

	public void setStatus(int status)
	{
		this.status = status;
	}


	public void setDuracionHoras(Integer duracionHoras)
	{
		if (duracionHoras == null)
		{
			this.duracionHoras = 0;
			return;
		}

		if (duracionHoras < 0)
		{
			this.duracionHoras = 0;
			return;
		}

		this.duracionHoras = duracionHoras;
	}
	
	public void setDuracionHoras( String duracionHoras)
	{
		Integer dm = null;
		try
		{
			dm = new Integer(duracionHoras);
		}
		catch(NumberFormatException e)
		{
			dm = null;
		}
		setDuracionHoras( dm );
	}

	public String getHoraInicioHor() {
		return horaInicioHor;
	}


	
	
	public void setHoraInicioHor(String horaInicioHor) {
		if (horaInicioHor == null)
		{
			this.horaInicioHor = "00";
			return;
		}

		if (Integer.valueOf(horaInicioHor) < 0)
		{
			this.horaInicioHor = "00";
			return;
		}

		this.horaInicioHor = horaInicioHor;
	}


	public String getHoraInicioMin() {
		return horaInicioMin;
	}


	public void setHoraInicioMin(String horaInicioMin) {
		if (horaInicioMin == null)
		{
			this.horaInicioMin = "00";
			return;
		}

		if (Integer.valueOf(horaInicioMin) < 0)
		{
			this.horaInicioMin = "00";
			return;
		}		
		this.horaInicioMin = horaInicioMin;
	}
	

	public String getHoraInicioSeg() {
		return horaInicioSeg;
	}


	public void setHoraInicioSeg(String horaInicioSeg) {
		if (horaInicioSeg == null)
		{
			this.horaInicioSeg = "00";
			return;
		}

		if (Integer.valueOf(horaInicioSeg) < 0)
		{
			this.horaInicioSeg = "00";
			return;
		}				
		this.horaInicioSeg = horaInicioSeg;
	}

	
	public String getHoraInicio() {
		return horaInicioHor +":"+ horaInicioMin  +":"+  horaInicioSeg;
	}
	
}
